Simulateur de Charges TNS - John COLIBRI. calcul ds charges sociales d'un gérant majoritaire
| - résumé : calculateur des charges sociales pour un travailleur indépendant
- mots clé : charges sociales, TNS, travailleur non salarié, gérant
majoritaire, cotisations sociales, maladie, allocations familiales, retraite, complémentaire, csg, rds, csg crds non déductible
- matériel utilisé : intel i3-8100, 3.6 gHz, 8GB memory, 128 G and 1 T hard disc
- logiciel utilisé : Windows 10 pro 64 bit, Delphi 7
- champ d'application : Delphi 1 à 7, 2006 à 2010, Xe_nnn, Seattle, Tokyo, Berlin, Delphi 10.3
- niveau : développeur Delphi
- plan :
1 - Charges Sociales TNS
Nous sommes actuellement (depuis 1980 !) en SARL. Pour comparer avec d'autres formes juridiques, nous souhaitions pouvoir comparer les diverses charges sociales. Cet article va donc permettre de calculer les charges sociales d'un TNS
(Travailleur Non Salarié)
2 - Principe 2.1 - Les Paramètres Nous avons placés les paramètres des charges dans un fichier .TXT ce qui
permettra de faire les calculs si les taux changent
// --- plafond et taux 2019>
plafond_secu 40524
plafond_retraite_2 37960
maladie_T1 7,20
maladie_T2 2,20
maladie_T3 0,85
allocations_T1 3,10
retraite_1 17,75
retraite_2 7,00
retraite_complementaire 8,00
formation_professionnelle 0,25
csg_crds_non_déductible 2,90
csg_déductible 6,80
|
2.2 - Les règles de calcul
3 - Le Projet Delphi de calcul de charges 3.1 - La classe de calcul Voici la définition de la classe de calcul:
Type c_calcul_charges_sarl=
Class(c_stringlist)
m_title: String;
m_month_count: Integer;
m_c_key_list, m_c_value_list: tStringList;
Constructor create_calcul_charges_sarl(p_name, p_path, p_file_name: String);
Function f_amount(p_key: String): Double;
Function f_rate(p_key: String): Double;
Procedure load_parameters;
Procedure display_parameters;
Procedure compute_charges(p_salaire,
p_cotisations_sociales_obligatoire_precedentes: Double);
Destructor Destroy; Override;
End; // | Notez que
- au début nous avions utilisé des champs spécifiques: m_plafond_sécu, m_taux_maladie_T1 etc. Mais comme ces rubriques changent sans cesse, il fallait renommer ou créer de nouveaux champs à chaque fois. L'utilisation de
tStringList a résolu le problème
- nous avons utilisé deux tStringList parallèles: une pour les clés, une pour les valeurs. Il aurait été possible d'utiliser un tIniFile
3.2 - Le chargement des paramètres Simplement la lecture du fichier .TXT pour initialiser les champs de c_calcul_charges_sarl
Procedure c_calcul_charges_sarl.load_parameters;
Procedure _add_key_value(p_key, p_value: String);
Begin m_c_key_list.Add(p_key);
m_c_value_list.Add(p_value);
End; // _add_key_value
Var l_key, l_value: String;
Begin // load_parameters stop_if_empty;
display(m_c_stringlist.Text);
While Not f_end_of_file Do
Begin If Not f_is_blank_or_comment
Then Begin
l_key:= f_next_value; l_value:= f_next_value;
_add_key_value(l_key, l_value);
End Else
If m_title= ''
Then m_title:= m_trimmed_line
Else _add_key_value('','');
read_line; End; // while not f_end_of_file
End; // load_parameters |
3.3 - Les calculs En fait que des règles de trois:
Procedure c_calcul_charges_sarl.compute_charges(
p_salaire, p_cotisations_sociales_obligatoire_precedentes: Double);
Var l_total: Double;
Procedure _display(p_name, p_threshold: String;
p_base, p_rate, p_value, p_category_total: Double);
Var l_category_total: String; Begin
p_value:= p_value/ m_month_count;
If p_category_total= 0
Then l_category_total:= ''
Else l_category_total:= Format(' %10.2f', [p_category_total]);
l_total:= l_total+ p_value;
display(Format('%-31s %-14s %10.2f %5.2f %10.2f %s ',
[p_name, p_threshold, p_base, p_rate* 100, p_value, l_category_total]));
End; // _display Procedure _compute_maladie;
Var l_value, l_rate: Double;
Begin
If p_salaire< 0.40* f_amount('plafond_secu')
Then Begin
l_rate:= (f_rate('maladie_T1')- f_rate('maladie_T2'))/
(1.10* f_amount('plafond_secu'))* p_salaire
+ (f_rate('maladie_T2')- f_rate('maladie_T3'))/
(0.40* f_amount('plafond_secu'))* p_salaire
+ f_rate('maladie_T3');
l_rate:= l_rate/ 100;
l_value:= p_salaire* l_rate;
_display('maladie_1', '< 0.4* pss', p_salaire, l_rate, l_value, 0);
End Else
If p_salaire< 1.10* f_amount('plafond_secu')
Then Begin
l_rate:= (f_rate('maladie_T1')- f_rate('maladie_T2'))/
(1.10* f_amount('plafond_secu'))* p_salaire
+ f_rate('maladie_T2') ;
l_rate:= l_rate/ 100;
l_value:= p_salaire* l_rate;
_display('maladie_1', '< 1.1* pss', p_salaire, l_rate, l_value, 0);
End
Else Begin
l_rate:= f_rate('maladie_T1');
l_rate:= l_rate/ 100;
l_value:= p_salaire* l_rate;
_display('maladie_1', '> 1.1* pss', p_salaire, l_rate, l_value, 0);
End; End; // _compute_maladie
Procedure _compute_allocations;
Var l_value, l_rate: Double;
Begin
If p_salaire< 1.10* f_amount('plafond_secu')
Then Begin
display('no_alloc');
End Else
If (p_salaire>= 1.10* f_amount('plafond_secu'))
And (p_salaire< 1.40* f_amount('plafond_secu'))
Then Begin
l_rate:= f_rate('allocations_T1')/ (0.30* f_amount('plafond_secu'))*
(p_salaire- 1.10* f_amount('plafond_secu')) ;
l_rate:= l_rate/ 100;
l_value:= p_salaire* l_rate;
_display('alloc_2', '1.1 1.4 pss', p_salaire, l_rate, l_value, 0);
End Else
If (p_salaire>= 1.40* f_amount('plafond_secu'))
Then Begin
l_rate:= f_rate('allocations_T1')/ 100;
l_value:= p_salaire* l_rate;
_display('alloc_3', '> 1.4 pss', p_salaire, l_rate, l_value, 0);
End;
End; // _compute_allocations Procedure _compute_retraite_base;
Var l_base, l_rate, l_value: Double;
Begin
l_base:= Min(p_salaire, f_amount('plafond_secu'));
l_rate:= f_rate('retraite_base_1')/ 100;
l_value:= l_base* l_rate;
_display('retraite_1', '< pss', l_base, l_rate, l_value, 0);
l_base:= p_salaire- f_amount('plafond_secu');
If l_base> 0
Then Begin
l_rate:= f_rate('retraite_base_2')/ 100;
l_value:= l_base* l_rate;
_display('retraite_2', '> pss', l_base, l_rate, l_value, 0);
End; End; // _compute_retraite_base
Procedure _compute_retraite_complementaire;
Var l_base, l_rate, l_value: Double;
Begin
l_base:= Min(p_salaire, f_amount('plafond_complementaire'));
l_rate:= f_rate('retraite_complementaire_1')/ 100;
l_value:= l_base* l_rate;
_display('complem_1', '< compl', l_base, l_rate, l_value, 0);
l_base:= p_salaire- f_amount('plafond_complementaire');
If l_base> 0
Then Begin
l_base:= Min(l_base, 4* f_amount('plafond_secu'));
l_rate:= f_rate('retraite_complementaire_2')/ 100;
l_value:= l_base* l_rate;
_display('complem_2', '> compl', l_base, l_rate, l_value, 0);
End End; // _compute_retraite_complementaire
Procedure _compute_formation_professionnelle;
Var l_base, l_rate, l_value: Double;
Begin l_base:= f_amount('plafond_secu');
l_rate:= f_rate('formation_professionnelle')/ 100;
l_value:= l_base* l_rate;
_display('form_profess', 'plaf', l_base, l_rate, l_value, 0);
End; // _compute_formation_professionnelle
Procedure _compute_csg_crds;
Var l_base, l_rate, l_value: Double;
Begin
l_base:= p_salaire+ p_cotisations_sociales_obligatoire_precedentes;
l_rate:= f_rate('csg_crds_non_deductible')/ 100;
l_value:= l_base* l_rate;
_display('csg_crds', 'sal+cot_p', l_base, l_rate, l_value, 0);
l_rate:= f_rate('csg_deductible')/ 100;
l_value:= l_base* l_rate;
_display('csg_deduc', 'sal+cot_p', l_base, l_rate, l_value, 0);
End; // _compute_csg_crds Procedure _compute_xxx;
Begin End; // _compute_xxx
Begin // compute_charges display_line;
display('-----');
display(Format('Charges Salaire: %10.2f cotisations n- 1 %10.2f',
[p_salaire, p_cotisations_sociales_obligatoire_precedentes])); display_line;
l_total:= 0; _compute_maladie; display_line;
_compute_allocations; display_line; _compute_retraite_base;
_compute_retraite_complementaire; display_line;
display(Format('total cotisations obligatoires %s %10.2f',
[f_spaces(41), l_total])); display_line;
_compute_formation_professionnelle; display_line; _compute_csg_crds;
display_line;
display(Format('%s %10.2f', [f_spaces(58+ 5), l_total]));
End; // compute_charges |
4 - Mini How To Voici l'image de l'application
Donc - initialisez le fichier des paramètres. 2019 est fourni dans le .ZIP, 2020
est fourni, mais partiel (nous n'avons pas trouvé toutes les informations
- sélectionnez le fichier de paramètres dans la tFileListBox
- entrez le salaire net et les cotisations sociales précédentes
- soit en cliquant un des trois tRadioButton (< plafond, > plafond, >> plafond)
- soit en saisissant manuellement les valeurs qui vous intéressent
- cliquez "compute_"
Nous avons utilisé comme exemple une valeur mettant en oeuvre tous les taux. Nous avons validé les calculs pour notre cas personnel (qui n'est pas 120.000 !) pour 2019.
5 - Améliorations
5.1 - Quelques pistes - formuler une liste de règles et calculer automatiquement les valeurs, en utilisant éventuellement le pattern strategy
- si quelqu'un a les taux 2020, je mettrai à jour la table des paramètres
- nous n'avons pas traités tous les cas spéciaux (cotisations minimales, épouse etc)
5.2 - Liens Quelques liens pour trouver des taux (2019 !) et aussi
6 - Télécharger le code source Delphi Vous pouvez télécharger: Ce .ZIP qui comprend:
- le .DPR, la forme principale, les formes annexes eventuelles
- les fichiers de paramètres (le schéma et le batch de création)
- dans chaque .ZIP, toutes les librairies nécessaires à chaque projet (chaque .ZIP est autonome)
Ces .ZIP, pour les projets en Delphi 6, contiennent des chemins RELATIFS. Par conséquent: - créez un répertoire n'importe où sur votre machine
- placez le .ZIP dans ce répertoire
- dézippez et les sous-répertoires nécessaires seront créés
- compilez et exécutez
Ces .ZIP ne modifient pas votre PC (pas de changement de la Base de Registre, de DLL ou autre). Pour supprimer le projet, effacez le répertoire.
La notation utilisée est la notation alsacienne qui consiste à préfixer les identificateurs par la zone de compilation: K_onstant, T_ype, G_lobal,
L_ocal, P_arametre, F_unction, C_lasse. Elle est présentée plus en détail dans l'article La
Notation Alsacienne
Comme d'habitude: - nous vous remercions de nous signaler toute erreur, inexactitude ou
problème de téléchargement en envoyant un e-mail à jcolibri@jcolibri.com. Les corrections qui en résulteront pourront aider les prochains lecteurs
- tous vos commentaires, remarques, questions, critiques, suggestion d'article, ou mentions d'autres sources sur le même sujet seront de même les bienvenus à jcolibri@jcolibri.com.
- plus simplement, vous pouvez taper (anonymement ou en fournissant votre e-mail pour une réponse) vos commentaires ci-dessus et nous les envoyer en cliquant "envoyer" :
- et si vous avez apprécié cet article, faites connaître notre site, ajoutez un lien dans vos listes de liens ou citez-nous dans vos
blogs ou réponses sur les messageries. C'est très simple: plus nous aurons de visiteurs et de références Google, plus nous écrirons d'articles.
7 - L'auteur
John COLIBRI est passionné par le développement Delphi et les applications de Bases de Données. Il a écrit de nombreux livres et articles, et partage son temps entre le développement de projets (nouveaux projets, maintenance, audit, migration BDE, migration Xe_n, refactoring) pour ses clients, le
conseil (composants, architecture, test) et la
formation. Son site contient des articles
avec code source, ainsi que le programme et le calendrier des stages de formation Delphi, base de données, programmation objet, Services Web, Tcp/Ip et
UML qu'il anime personellement tous les mois, à Paris, en province ou sur site client. |